# 【一】第一步 创建一个管道类
# 在 items. py 中创建管道类
"""
# 创建一个管道类 继承 scrapy.Item
class CnBlogItem(scrapy.Item):
    # 定义管道类中的字段
    title = scrapy.Field()
    detail_url = scrapy.Field()
    desc = scrapy.Field()
    author_name = scrapy.Field()
    author_blog = scrapy.Field()
    comment_num = scrapy.Field()
    up_num = scrapy.Field()
    visit_num = scrapy.Field()
"""
# 【二】定义管道处理数据函数
# 在 pipelines.py 定义管道类中的数据的处理方式
'''
class CnBlogPipeline:
    def process_item(self, item, spider):
        print(item)
        return item
'''
# 【三】注册到配置文件中
'''
# 管道类 --- Django的模型表
ITEM_PIPELINES = {
   # "SpiderScrapy.pipelines.SpiderscrapyPipeline": 300,
   "SpiderScrapy.pipelines.CnBlogPipeline": 300,
}
'''

# 【四】操作管道类 向管道类中添加数据
'''
    # 解析响应的函数
    # 【二】解析方式二：通过 Xpath 选择器进行解析数据
    def parse(self, response):
        # 【0】创建管道类对象
        item = CnBlogItem()

        # 【1】获取所有的文章列表
        article_list_all = response.xpath('//*[@id="post_list"]/article')
        # 【2】遍历每一篇文章获取到文章详情内容
        for article_obj in article_list_all:
            # （3）文章标题
            title = article_obj.xpath('./section/div/a/text()').extract_first()
            try:
                # （4）文章详情链接
                detail_url = article_obj.xpath('./section/div/a/@href').extract_first()
                # （5）文章简介内容
                try:
                    desc = article_obj.xpath('./section/div/p/text()').extract()[1].strip()
                except Exception as e:
                    desc = ""
                # （6）作者名字
                author_name = article_obj.xpath('./section/footer/a[1]/span/text()').extract_first()
                # （7）作者主页地址
                author_blog = article_obj.xpath('./section/footer/a[1]/@href').extract_first()
                # （8）评论数
                comment_num = article_obj.xpath('./section/footer/a[2]/span/text()').extract_first()
                # （9）点赞数
                up_num = article_obj.xpath('./section/footer/a[3]/span/text()').extract_first()
                # （10）观看数
                visit_num = article_obj.xpath('./section/footer/a[4]/span/text()').extract_first()

                # （11）将上面解析到 所有数据添加到 管道类中
                # 管道类对象类似于 字典
                item.update({
                    "title": title,
                    "detail_url": detail_url,
                    "desc": desc,
                    "author_name": author_name,
                    "author_blog": author_blog,
                    "comment_num": comment_num,
                    "up_num": up_num,
                    "visit_num": visit_num,
                })

                # 提交管道数据
                yield item
            except Exception as e:
                print(f"{title} :&gt;&gt;&gt;&gt; {e}")
'''

# 【五】管道类存储本地数据
"""
class CnBlogPipeline:
    def open_spider(self, spider):
        '''
        每次启动爬虫项目会触发一次
        不是 每一次提交 item 一次
        可以放数据库的创建连接
        可以放文件的打开
        :param spider:
        :return:
        '''
        print('爬虫项目启动成功 :&gt;&gt;&gt;&gt; ', spider)

        # 将打开文件的句柄初始化成类的参数
        self.fp = open("./blog_pipline.json", "a", encoding="utf8")

    def close_spider(self, spider):
        '''
        每次关闭爬虫项目会启动一次
        # 可以放数据库的关闭
        可以放文件的关闭
        :param spider:
        :return:
        '''
        print('爬虫项目结束 :&gt;&gt;&gt;&gt; ', spider)

        # 关闭打开的文件对象
        self.fp.close()

    def process_item(self, item, spider):
        # 不断地更新传过来的 json 数据
        print(item) # 这里传过来的是 scrapy 的 item 对象所以json 不识别 切换成字典格式
        json.dump(obj=dict(item), fp=self.fp, ensure_ascii=False)
        return item
"""
